package com.jlf.tool.xss;

import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Safelist;

/**
 * 过滤工具
 *
 * @author 吴建荣 2019-04-15
 */
@Slf4j
public class JsoupUtil {
    /**
     * 标签白名单
     * relaxed() 允许的标签:
     *  a, b, blockquote, br, caption, cite, code, col, colgroup, dd, dl, dt, em, h1, h2, h3, h4,
     *  h5, h6, i, img, li, ol, p, pre, q, small, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, u, ul。
     *  结果不包含标签rel=nofollow ，如果需要可以手动添加。
     */
    static Safelist SAFELIST = Safelist.relaxed();

    /**
     * 配置过滤化参数,不对代码进行格式化
     */
    static Document.OutputSettings OUTPUT_SETTINGS = new Document.OutputSettings().prettyPrint(false);

//     * 设置自定义的标签和属性
//     * addTags() 设置白名单标签
//     * addAttributes()  设置标签需要保留的属性 ,[:all]表示所有
//     * preserveRelativeLinks()  是否保留元素的URL属性中的相对链接，或将它们转换为绝对链接,默认为false.
//     为false时将会把baseUri和元素的URL属性拼接起来
    static {
    SAFELIST.addTags("s");
    SAFELIST.addAttributes(":all","style", "class", "title");
    SAFELIST.preserveRelativeLinks(true);
    }

    /**
     * baseUri ,非空
     * 如果baseUri为空字符串或者不符合Http://xx类似的协议开头,属性中的URL链接将会被删除,如&lt;a href='xxx'/&gt;会变成&lt;a/&gt;
     * 如果WHITELIST.preserveRelativeLinks(false), 会将baseUri和属性中的URL链接进行拼接
     * @param s 原始字符串
     * @return 清理后的字符串
     */
    public static String clean(String s) {
        log.trace("[xss过滤标签和属性] [原字符串为] : {}", s);
        String r = Jsoup.clean(s, "", SAFELIST, OUTPUT_SETTINGS);
        log.trace("[xss过滤标签和属性] [过滤后的字符串为] : {}", r);
        return r;
    }
}
